<?php

require_once 'BancoDeDados.php';
require_once 'Objeto.php';

class Imagem {

    private $cod_imagem;
    private $fotografo;
    private $nome;
    private $foto;
    private $objeto;

    public function &getCod_imagem() {
        return $this->cod_imagem;
    }

    public function setCod_imagem(&$cod_imagem) {
        $this->cod_imagem = &$cod_imagem;
    }

    public function &getFotografo() {
        return $this->fotografo;
    }

    public function setFotografo(&$fotografo) {
        $this->fotografo = &$fotografo;
    }

    public function &getNome() {
        return $this->nome;
    }

    public function setNome(&$nome) {
        $this->nome = &$nome;
    }

    /**
     *
     * @return Objeto
     */
    public function &getObjeto() {
        return $this->objeto;
    }

    public function setObjeto(Objeto &$objeto) {
        $this->objeto = &$objeto;
    }

    public function &getFoto() {
        return $this->foto;
    }

    public function setFoto(&$foto) {
        $this->foto = &$foto;
    }

    public function cadastrar() {
        if (!$this->validar()) {
            throw new Exception('Imagem existente');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into imagem (cod_interno, fotografo, nome, foto) values(?,?,?,?)');
        $result = $link->execute($stmt, array($this->objeto->getCod_Interno(), $this->fotografo, $this->nome, $this->foto));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $result = $banco->getLink()->query('select cod_imagem from imagem where cod_interno = ? and nome = ?', array($this->objeto->getCod_interno(), $this->nome));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() == 0) {
            throw new Exception("Imagem inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de uma Imagem com o mesmo identificador, informar ao administrador");
        }
        $result->fetchInto($row);
        $this->setCod_imagem($row['cod_imagem']);
        $link->commit();
    }

    public function alterarCampo(&$campo_id, &$campo_valor) {
        if ($campo_id == 'nome' && $this->nome != $campo_valor) {
            $this->nome = &$campo_valor;
        } else if ($campo_id == 'fotografo' && $this->fotografo != $campo_valor) {
            $this->fotografo = &$campo_valor;
        } else if ($campo_id == 'nome' && $this->nome != $campo_valor) {
            $this->nome = &$campo_valor;
        } else if ($campo_id == 'foto' && $this->foto != $campo_valor) {
            $this->foto = &$campo_valor;
        } else {
            throw new Exception('no_action');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update imagem set ' . $campo_id . ' = ? where cod_imagem = ?');
        $result = $link->execute($stmt, array($campo_valor, $this->cod_imagem));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

    public function excluir() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from imagem where cod_imagem = ?');
        $result = $link->execute($stmt, array($this->cod_imagem));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

    public static function listar(&$cod_interno) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_imagem, fotografo, nome, foto from imagem where cod_interno = ?', array($cod_interno));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() == 0) {
            throw new Exception("Imagem inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de uma Imagem com o mesmo identificador, informar ao administrador");
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $imagem = new Imagem();
            $imagem->setCod_imagem($row['cod_imagem']);
            $imagem->setFotografo($row['fotografo']);
            $imagem->setNome($row['nome']);
            $imagem->setFoto($row['foto']);
            $resultado[$row['cod_imagem']] = &$imagem;
            unset($imagem);
        }
        return $resultado;
    }

    private function &validar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_imagem from imagem where cod_interno = ?', array($this->objeto->getCod_interno()));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() > 0) {
            return false;
        }
        return true;
    }

}
?>